package fun.sanguo.utils.sqlBuilder;

import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.jdbc.SQL;
import fun.sanguo.model.dto.PageQuery;
import fun.sanguo.model.entity.sys.SysUserEntity;
import fun.sanguo.model.enums.DelFlagEnums;

/**
 * 系统-用户信息 sql语句生成类
 *
 * @author ZYP
 * @date 2023-06-09
 */
public class SqlBuilderSysUser {

    /**
     * 用户信息表-查询总量
     *
     * @param sysUserEntity
     * @return
     */
    public String getTotal(SysUserEntity sysUserEntity) {
        return new SQL() {{
            SELECT("COUNT(1)");
            FROM("SYS_USER");
            if (StringUtils.isNotEmpty(sysUserEntity.getNickname())) {
                WHERE("NICKNAME LIKE '%" + sysUserEntity.getNickname() + "%'");
            }
            if (StringUtils.isNotEmpty(sysUserEntity.getGender())) {
                // 下拉框等于
                WHERE("GENDER = '" + sysUserEntity.getGender() + "'");
            }
            if (StringUtils.isNotEmpty(sysUserEntity.getMobile())) {
                WHERE("MOBILE LIKE '%" + sysUserEntity.getMobile() + "%'");
            }
            if (StringUtils.isNotEmpty(sysUserEntity.getWeixin())) {
                WHERE("WEIXIN LIKE '%" + sysUserEntity.getWeixin() + "%'");
            }
            // 过滤已删除数据
            WHERE("DEL_FLAG = '" + DelFlagEnums.NORMAL.getCode() + "'");
        }}.toString();
    }

    /**
     * 用户信息表-查询列表
     *
     * @param sysUserEntity
     * @param pageQuery
     * @return
     */
    public String getList(SysUserEntity sysUserEntity, PageQuery pageQuery) {
        return new SQL() {{
            SELECT("*");
            FROM("SYS_USER");
            if (StringUtils.isNotEmpty(sysUserEntity.getNickname())) {
                WHERE("NICKNAME LIKE '%" + sysUserEntity.getNickname() + "%'");
            }
            if (StringUtils.isNotEmpty(sysUserEntity.getGender())) {
                // 下拉框等于
                WHERE("GENDER = '" + sysUserEntity.getGender() + "'");
            }
            if (StringUtils.isNotEmpty(sysUserEntity.getMobile())) {
                WHERE("MOBILE LIKE '%" + sysUserEntity.getMobile() + "%'");
            }
            if (StringUtils.isNotEmpty(sysUserEntity.getWeixin())) {
                WHERE("WEIXIN LIKE '%" + sysUserEntity.getWeixin() + "%'");
            }
            // 过滤已删除数据
            WHERE("DEL_FLAG = '" + DelFlagEnums.NORMAL.getCode() + "'");
            // 排序
            if (StringUtils.isNotEmpty(pageQuery.getSortField()) && StringUtils.isNotEmpty(pageQuery.getSortOrder())) {
                ORDER_BY(pageQuery.getSortField() + " " + pageQuery.getSortOrder());
            }
            // 分页
            if (pageQuery.getPageNum() > 0 && pageQuery.getPageSize() > 0) {
                LIMIT((pageQuery.getPageNum() - 1) * pageQuery.getPageSize() + ", " + pageQuery.getPageSize());
            }
        }}.toString();
    }

    /**
     * 用户信息表-新增
     *
     * @param sysUserEntity
     * @return
     */
    public String insert(SysUserEntity sysUserEntity) {
        return new SQL() {{
            INSERT_INTO("SYS_USER");
            VALUES("username", "#{username}");
            VALUES("password", "#{password}");
            VALUES("nickname", "#{nickname}");
            VALUES("gender", "#{gender}");
            VALUES("avatar", "#{avatar}");
            VALUES("mobile", "#{mobile}");
            VALUES("weixin", "#{weixin}");
            // 通用字段
            VALUES("id", "#{id}");
            VALUES("create_by", "#{createBy}");
            VALUES("create_time", "#{createTime}");
            VALUES("update_by", "#{updateBy}");
            VALUES("update_time", "#{updateTime}");
            VALUES("remark", "#{remark}");
            VALUES("version", "#{version}");
            VALUES("del_flag", DelFlagEnums.NORMAL.getCode());
        }}.toString();
    }

    /**
     * 用户信息表-编辑
     *
     * @param sysUserEntity
     * @return
     */
    public String update(SysUserEntity sysUserEntity) {
        return new SQL() {{
            UPDATE("SYS_USER");
            SET("username = #{username}");
            SET("nickname = #{nickname}");
            SET("gender = #{gender}");
            SET("avatar = #{avatar}");
            SET("mobile = #{mobile}");
            SET("weixin = #{weixin}");
            // 通用字段
            SET("update_by = #{updateBy}");
            SET("update_time = #{updateTime}");
            SET("remark = #{remark}");
            // 条件
            WHERE("id = #{id}");
        }}.toString();
    }

    /**
     * 用户信息表-删除
     *
     * @param sysUserEntity
     * @return
     */
    public String delete(SysUserEntity sysUserEntity) {
        return new SQL() {{
            UPDATE("SYS_USER");
            // 通用字段
            SET("update_by = #{updateBy}");
            SET("update_time = #{updateTime}");
            SET("del_flag = '" + DelFlagEnums.DELETED.getCode() + "'");
            // 条件
            WHERE("id = #{id}");
        }}.toString();
    }

    /**
     * 用户信息表-生成用户编号
     *
     * @return
     */
    public String generateUsercode() {
        return new SQL() {{
            SELECT("nvl(max(usercode)+1, 1) as usercode");
            FROM("SYS_USER");
        }}.toString();
    }

    /**
     * 用户信息表-根据ID查询用户信息
     *
     * @param id
     * @return
     */
    public String getById(String id) {
        return new SQL() {{
            SELECT("*");
            FROM("SYS_USER");
            // 条件
            WHERE("id = #{id}");
        }}.toString();
    }

    /**
     * 用户信息表-根据登陆账号查询用户信息
     *
     * @param username
     * @return
     */
    public String getByUsername(String username) {
        return new SQL() {{
            SELECT("*");
            FROM("SYS_USER");
            // 条件
            WHERE("username = #{username}");
        }}.toString();
    }

    /**
     * 用户信息表-根据手机号码查询用户信息
     *
     * @param mobile
     * @return
     */
    public String getByMobile(String mobile) {
        return new SQL() {{
            SELECT("*");
            FROM("SYS_USER");
            // 条件
            WHERE("mobile = #{mobile}");
        }}.toString();
    }

    /**
     * 用户信息表-修改密码
     *
     * @param sysUserEntity
     * @return
     */
    public String updatePassword(SysUserEntity sysUserEntity) {
        return new SQL() {{
            UPDATE("SYS_USER");
            SET("password = #{password}");
            // 通用字段
            SET("update_by = #{updateBy}");
            SET("update_time = #{updateTime}");
            // 条件
            WHERE("id = #{id}");
        }}.toString();
    }
}
